package ar.edu.utn.frba.tacs.warnes.rest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.ResourceException;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;
import org.springframework.stereotype.Component;

import ar.edu.utn.frba.tacs.warnes.Auto;
import ar.edu.utn.frba.tacs.warnes.aop.Utils;
import ar.edu.utn.frba.tacs.warnes.excepciones.RestException;
import ar.edu.utn.frba.tacs.warnes.pieza.Pieza;
import ar.edu.utn.frba.tacs.warnes.utils.ContenedorWarnes;
import ar.edu.utn.frba.tacs.warnes.utils.ConstantesWarnes.Categoria;

import com.thoughtworks.xstream.XStream;
@Component
public class PiezasResource extends Resource{
	
	XStream xstream = new XStream();
	private final String dir = System.getProperties().getProperty("user.dir");

	@Override
	public boolean allowDelete() {
		return false;
	}

	@Override
	public boolean allowGet() {
		return true;
	}

	@Override
	public boolean allowPost() {
		return true;
	}

	@Override
	public boolean allowPut() {
		return true;
	}

	public void init(Context context, Request request, Response response) {
		super.init(context, request, response);
		getVariants().add(new Variant(MediaType.TEXT_XML));
	}
	
	public Representation represent(Variant variant) throws ResourceException {		
		return new StringRepresentation(xstream
				.toXML(ContenedorWarnes.getInstance().getPiezas()), MediaType.TEXT_XML);
	}

	public String guardarPieza(Pieza pieza) {
		String xml;
		String ruta = this.dir + "\\rest\\pieza\\";
		xml = this.xstream.toXML(pieza);
		try {
			Utils.grabarArchivoADisco(ruta, "pieza-id=" + pieza.getId()
					+ ".xml", xml);
		} catch (IOException ex) {
			throw new RestException(ex.getMessage());
		}
		return xml;
	}

	public String getPiezaPorCategoria(Categoria categoria) {
		List<Pieza> piezas = new ArrayList<Pieza>();
		piezas = ContenedorWarnes.getInstance().getPiezas(categoria);
		return this.guardarPiezasEnCategoria(piezas, categoria);
	}

	public String guardarPiezasEnCategoria(List<Pieza> piezas,
			Categoria categoria) {
		String xml;
		String ruta = this.dir + "\\rest\\pieza\\";
		xml = this.xstream.toXML(piezas);
		try {
			Utils.grabarArchivoADisco(ruta, "piezas-categoria="
					+ categoria.toString() + ".xml", xml);
		} catch (IOException ex) {
			throw new RestException(ex.getMessage());
		}
		return xml;
	}
	
	public String getPiezaDeAuto(Auto auto) {
		List<Pieza> piezas = new ArrayList<Pieza>();
		piezas = auto.getPiezasDelAuto();
		return this.guardarPiezasDeAuto(piezas, auto);
	}

	public String guardarPiezasDeAuto(List<Pieza> piezas,
			Auto auto) {
		String xml;
		String ruta = this.dir + "\\rest\\pieza\\";
		xml = this.xstream.toXML(piezas);
		try {
			Utils.grabarArchivoADisco(ruta, "piezas-auto="
					+ auto.toString() + ".xml", xml);
		} catch (IOException ex) {
			throw new RestException(ex.getMessage());
		}
		return xml;
	}
	
	public String getPiezasReservadas() {
		List<Pieza> piezas = new ArrayList<Pieza>();
		piezas = ContenedorWarnes.getInstance().getPiezas(ar.edu.utn.frba.tacs.warnes.utils.ConstantesWarnes.PiezaState.RESERVADA);
		return this.guardarPiezasReservadas(piezas);
	}

	public String guardarPiezasReservadas(List<Pieza> piezas){
		String xml;
		String ruta = this.dir + "\\rest\\pieza\\";
		xml = this.xstream.toXML(piezas);
		try {
			Utils.grabarArchivoADisco(ruta, "piezas-Reservadas.xml", xml);
		} catch (IOException ex) {
			throw new RestException(ex.getMessage());
		}
		return xml;
	}
}
